/**
 * 拓扑排序伪代码
 * 算法思想(借用栈实现)：
 * 1.从AOV网中选择一个入度为0的顶点，并输入
 * 2.从网中删除该顶点和以它为起点的有向边
 * 重复1,2直到当前的AOV网为空或当前网中不存在无前驱的顶点为止，否则图中必然存在环
 */

bool TopoLogicalSort(Graph* G)
{
	InitStack(S);	//初始化栈，存入度为0的顶点
	int i=0;
	for(i=0;i<G->vex_num;i++)
	{
		if(indegree[i]==0) Push(S,i);	//如果图中某一顶点的入度为0，则入栈
	}
	
	int count=0;	//计数器，用来记录当前已经输出的顶点数
	while(!StackIsEmpty(S))	//栈不为空，即栈中存在入度为0的顶点
	{
		Pop(S,i);//栈顶元素i出栈
		print(i);	//打印栈顶元素
		count++;	//计数器+1
		//寻找出出栈元素i所指向的元素p,寻找方式是根据邻接表寻找
		for(p=G->vertex_array[i].first_vex;p;p=p->next_vetex)
		{
			v=p->adj_vex;	//v=p;
			//如果v减去一个入度=0,则入栈
			if(--indegree[v]==0) Push(S,v);
		}
	}
	
	//如果计数器小于总顶点数, 则存在环路,否则不存在环路
	if(count<G->vex_num) return false;
	else return true;
	
}